package it.scambiocorse.start.controller;

import java.util.ArrayList;
import java.util.List;

import it.scambiocorse.dao.UtenteService;
import it.scambiocorse.model.UtenteType;
import it.scambiocorse.utils.InviaEmail;
import it.scambiocorse.utils.LabelValueBean;
import it.scambiocorse.utils.ResourceManager;
import it.scambiocorse.utils.Utils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import org.springframework.web.servlet.view.RedirectView;

public class FiltroController extends MultiActionController {
	private UtenteService utenteDao = null;

	public UtenteService getUtenteDao() {
		return utenteDao;
	}

	public void setUtenteDao(UtenteService utenteDao) {
		this.utenteDao = utenteDao;
	}

	final Logger logger = Logger.getLogger(getClass());

	public ModelAndView index(HttpServletRequest request,
			HttpServletResponse response, UtenteType dettaglio)
			throws Exception {
		String url = "login";
		ModelAndView mav = new ModelAndView(url);

		logger.warn("Sono in filtroController --> index");
		try {
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) 	|| session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
			} else {
				dettaglio = (UtenteType) session.getAttribute("dettaglio"); // -----> OK LOGIN
				if (!Utils.isValid(dettaglio.getActivation())) {
					logger.debug(" Utente loggato procedo al riepilogo");
					return new ModelAndView(new RedirectView("areaPrivata/riepilogo.html"));
				} else {
					logger.debug(" Utente loggato ma NON ATTIVO, procedo al redirect verso l'attivazione");
					mav = new ModelAndView("index"); 
					mav.addObject("isNewUser", true);
					mav.addObject("command", dettaglio);
					return mav;
				}
			}

			logger.warn("Nuova Sessione");
			dettaglio = new UtenteType();

			
			mav.addObject("command", dettaglio);
			mav.addObject("newUser", dettaglio);
			mav.addObject("isNewUser", true);

			return mav;

		} catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: " + dettaglio.getIdUser());
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}

	public ModelAndView login(HttpServletRequest request,HttpServletResponse response, UtenteType dettaglio) throws Exception {
		List<LabelValueBean> errori = new ArrayList<LabelValueBean>();
		List<LabelValueBean> ok = new ArrayList<LabelValueBean>();
		String url = "login";
		UtenteType loggedUser = null;
		logger.warn("Sono in filtroController --- login(...)");
		try {
			HttpSession session = request.getSession(false);
			ModelAndView mav = new ModelAndView(url);
			if (!Utils.isValid(dettaglio.getEmail())) {
				errori.add(new LabelValueBean("Login fallito, inserire l'email", null));
			} else if (!Utils.isValid(dettaglio.getPass())) {
				errori.add(new LabelValueBean("Login fallito, inserire la password", null));
			} else {
				logger.warn("login in corso...");
				loggedUser = utenteDao.login(dettaglio.getEmail(),dettaglio.getPass());

				if (loggedUser == null) {
					logger.warn("login fallito...");
					
					errori.add(new LabelValueBean("Login fallito, controllare il nome utente o la password",null));
				} else {
					dettaglio = loggedUser;
					if (Utils.isValid(dettaglio.getActivation())) {
						logger.warn("login RIUSCITO ma utente non ATTIVO... redirect a nuovoUser");
						mav = new ModelAndView("index");
						dettaglio.setActivation(null);
						mav.addObject("isNewUser", true);
					} else {
						logger.warn("login OK...");
						mav = new ModelAndView(new RedirectView("areaPrivata/riepilogo.html"));
						session.setAttribute("dettaglio", dettaglio);					
					}
	
				}

			}

			if (errori.size() > 0) {
				request.setAttribute("listaErrori", errori);
			}

			if (ok.size() > 0) {
				request.setAttribute("listaOk", ok);
			}

			mav.addObject("command", dettaglio);
			mav.addObject("newUser", new UtenteType());
			
			

			return mav;

		} catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: " + dettaglio.getIdUser());
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}

	public ModelAndView nuovoUser(HttpServletRequest request,
			HttpServletResponse response, UtenteType dettaglio)
			throws Exception {
		List<LabelValueBean> errori = new ArrayList<LabelValueBean>();
		List<LabelValueBean> ok = new ArrayList<LabelValueBean>();
		String url = "login";
		logger.warn("Sono in filtroController --- nuovoUser(...)");
		try {
			HttpSession session = request.getSession(false);
			ModelAndView mav = new ModelAndView(url);
			if (dettaglio.getIdUser() < 1) { // Per evitare il submit dopo la
												// registrazione, se idUser e'
												// valorizzato e' gia passato di
												// qui e deve andare a index

				if (!Utils.isValid(dettaglio.getEmail())) {
					errori.add(new LabelValueBean(
							"Per la registrazione e' necessario compilare il campo EMAIL",
							null));
				} else if (utenteDao.getIdUserDaEmail(dettaglio.getEmail()) > 0) {
					errori.add(new LabelValueBean(
							"Questa email risulta essere gia' associata a qualcuno.",
							null));
				} else if (!Utils.isValid(dettaglio.getPass())) {
					errori.add(new LabelValueBean(
							"Per la registrazione e' necessario compilare il campo PASSWORD",
							null));
				} else if (!Utils.isValid(dettaglio.getNome())) {
					errori.add(new LabelValueBean(
							"Per la registrazione e' necessario compilare il campo NOME",
							null));
				} else if (!Utils.isValid(dettaglio.getCognome())) {
					errori.add(new LabelValueBean(
							"Per la registrazione e' necessario compilare il campo COGNOME",
							null));
				} else {
					
					logger.warn("Creo il codice di conferma");
					String active = Utils.toMd5(dettaglio.getEmail()+dettaglio.getNome()+dettaglio.getCognome()+"CODVERIFICA1234");
					dettaglio.setActivation(active);
					logger.warn("Procedo all'inserimento del nuovo utente "+ dettaglio.getNome() + " " + dettaglio.getNome());
					int ret = utenteDao.inserisciUtente(dettaglio);
					InviaEmail im = (InviaEmail)ResourceManager.getBean("inviaEmail");
					im.inviaVerifica(dettaglio, active);
					
					if (ret > 0) {
						dettaglio.setIdUser(ret);
						dettaglio.setActivation(null);
						mav = new ModelAndView("index");
						mav.addObject("newUser", true);
						session = request.getSession(true);
					} else {
						errori.add(new LabelValueBean("Si sono verificati degli errori durante la registrazione",
								null));
					}

				}
			} else {
				mav = new ModelAndView("index");
				mav.addObject("newUser", true);
				session.setAttribute("dettaglio", dettaglio);
			}

			if (errori.size() > 0) {
				request.setAttribute("listaErrori", errori);
			}

			if (ok.size() > 0) {
				request.setAttribute("listaOk", ok);
			}

			mav.addObject("command", dettaglio);
			mav.addObject("newUser", dettaglio);
			mav.addObject("isNewUser", true);

			return mav;

		} catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: " + dettaglio.getIdUser());
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}

	
	
	public ModelAndView attiva(HttpServletRequest request, HttpServletResponse response, UtenteType dettaglio) throws Exception {
		List<LabelValueBean> errori = new ArrayList<LabelValueBean>();
		List<LabelValueBean> ok = new ArrayList<LabelValueBean>();
		String url = "index";
		logger.warn("Sono in filtroController --- login(...)");
		try {
			HttpSession session = request.getSession(false);
			ModelAndView mav = new ModelAndView(url);
			if (!Utils.isValid(dettaglio.getActivation())) {
				errori.add(new LabelValueBean("Attivazione fallita, inserire il codice", null));
			} else {
				logger.warn("attivazione in corso...");
				boolean isActive = utenteDao.attivaUtente(dettaglio.getIdUser(), dettaglio.getActivation());

				if (!isActive) {
					logger.warn("attivazione fallita...");
					errori.add(new LabelValueBean("Attivazione fallita, controllare il nome utente o la password",null));
				} else {
					logger.warn("attivazione OK...");
					dettaglio.setActivation(null);
					mav = new ModelAndView(new RedirectView("areaPrivata/riepilogo.html"));
					session.setAttribute("dettaglio", dettaglio);
				}

			}

			if (errori.size() > 0) {
				request.setAttribute("listaErrori", errori);
			}

			if (ok.size() > 0) {
				request.setAttribute("listaOk", ok);
			}
			
			mav.addObject("newUser", true);
			mav.addObject("command", dettaglio);

			return mav;

		} catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: " + dettaglio.getIdUser());
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject(e);
		}
	}	
	
	
	
	
}
